Object对象的方法
当Object 被作为工具方法,而不是构造方法时,
Object(arg):包装方法,将非对象类型包装成一个对象
Object.create(proto[, propertiesObject]):
Object.getPrototypeOf(obj):
Object实例对象的方法
必须区分“构造函数的方法”和“实例对象的方法”。
valueOf():返回当前对象对应的值。
toString():返回当前对象对应的字符串形式。
这个方法很有用,可以用于判断对象类型toLocalString():返回当前对象对应的本地字符串形式。
hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
isPrototypeOf():判断当前对象是否为另一个对象的原型。
propertyIsEnumerable():判断某个属性是否可枚举。
对象的属性模型
Object.getOwnPropertyDescriptor():获取对象的属性的精确描述模型
Object.defineProperty()
Object.defineProperties()
这两个方法有性能损耗,会拖慢执行速度,不宜大量使用。
可枚举性(enumerable)
如果一个属性的enumerable为false,下面三个操作不会取到该属性。
for..in循环
Object.keys方法
JSON.stringify方法(有时可以利用这一点,为对象添加注释信息。)
因此,enumerable可以用来设置“秘密”属性。
遍历对象属性方法
Object.keys()
Object.getOwnPropertyNames()
一般情况下,几乎总是使用Object.keys方法,遍历数组的属性。
存取器
var o ={
$n : 5,
get next(){return this.$n++ },
set next(n) {
if (n >= this.$n) this.$n = n;
else throw "新的值必须大于当前值";
}
};
o.next // 5
o.next = 10;
o.next // 10
利用存取器,可以实现数据对象与DOM对象的双向绑定。
对象拷贝
对于简单属性,就直接拷贝,对于那些通过描述对象设置的属性,则使用Object.defineProperty方法拷贝。
var extend = function (to, from) {
var descriptor = Object.getOwnPropertyDescriptor(from, property);
if (descriptor && ( !descriptor.writable
|| !descriptor.configurable
|| !descriptor.enumerable
|| descriptor.get
|| descriptor.set)) {
Object.defineProperty(to, property, descriptor);
} else {
to[property] = from[property];
}
}
控制对象状态
JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。
不可扩展对象(不能加,可改,可删)
Object.preventExtensions方法可以使得一个对象无法再添加新的属性。可以用delete命令删除它的现有属性。
判断: Object.isExtensible(obj);
密封的对象(不能加,删,可改)
Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。
判断: Object.isSealed(obj);
冻结的对象(不能加,不能改,不能删)
Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。
判断: Object.isFrozen(obj);
局限性: 需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。